package pe.edu.sisclas.controller;

import java.io.IOException;
import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;

import pe.edu.sisclas.model.domain.Docente;
import pe.edu.sisclas.model.domain.Soporte;
import pe.edu.sisclas.model.domain.Usuario;
import pe.edu.sisclas.model.service.UsuarioService;
import pe.edu.sisclas.model.service.exception.ServiceException;

public class UsuarioController implements Serializable{
	
	private static final long serialVersionUID = 1L;

	@Autowired
	private UsuarioService usuarioService;

	private Usuario usuario;
	private String usuario_;
	private String contrasenia;

	private Docente docente;
	private Soporte soporte;

	private boolean isLogged = false;

	public UsuarioController() {
	}

	public void login(ActionEvent evt) {
		RequestContext context = RequestContext.getCurrentInstance();

		if (this.usuario_.isEmpty() && this.contrasenia.isEmpty()) {
			isLogged = false;
			addWarn(FacesMessage.SEVERITY_WARN, "Complete todos los campos");
		} else {
			if (this.contrasenia.isEmpty()) {
				isLogged = false;
				addWarn(FacesMessage.SEVERITY_WARN,
						"Ingrese una contrase\u00f1a");
			} else {
				if (this.usuario_.isEmpty()) {
					isLogged = false;
					addWarn(FacesMessage.SEVERITY_WARN,
							"Ingrese nombre de usuario");
				} else {
					try {
						this.usuario = this.usuarioService.obtenerUsuario(
								usuario_, contrasenia);
					} catch (ServiceException e) {
						isLogged = false;
						addWarn(FacesMessage.SEVERITY_ERROR, e.getMessage());
						return;
					}

					if (this.usuario == null) {
						isLogged = false;
						addWarn(FacesMessage.SEVERITY_ERROR,
								"Usuario no registrado");
					} else {
						isLogged = true;
						this.docente = this.usuario.getDocente();
						this.soporte = this.usuario.getSoporte();
						
						addWarn(FacesMessage.SEVERITY_INFO,
								(this.docente == null) ? this.soporte
										.getNombreDocente() : this.docente
										.getNombreDocente());
						context.addCallbackParam("isLogged", isLogged);
						context.addCallbackParam("view",
								"/sisclas/pages/listaIncidencias.jsf");
					}
				}
			}
		}
	}

	public void logout(ActionEvent evt) throws IOException {
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance()
				.getExternalContext().getSession(false);
		session.invalidate();
		isLogged = false;

		FacesContext.getCurrentInstance().getExternalContext()
				.redirect("/sisclas/");
	}

	private void addWarn(Severity severity, String mensaje) {
		String summary = (severity.equals(FacesMessage.SEVERITY_INFO)) ? "Bienvenid@:"
				: (severity.equals(FacesMessage.SEVERITY_WARN)) ? "Advertencia:"
						: "Error:";
		FacesContext.getCurrentInstance().addMessage(null,
				new FacesMessage(severity, summary, mensaje));
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public boolean isLogged() {
		return isLogged;
	}

	public void setLogged(boolean isLogged) {
		this.isLogged = isLogged;
	}

	public String getUsuario_() {
		return usuario_;
	}

	public void setUsuario_(String usuario_) {
		this.usuario_ = usuario_;
	}

	public String getContrasenia() {
		return contrasenia;
	}

	public void setContrasenia(String contrasenia) {
		this.contrasenia = contrasenia;
	}

	public Docente getDocente() {
		return docente;
	}

	public void setDocente(Docente docente) {
		this.docente = docente;
	}

	public Soporte getSoporte() {
		return soporte;
	}

	public void setSoporte(Soporte soporte) {
		this.soporte = soporte;
	}

}
